package cn.tanglong.basic.util;

import cn.tanglong.user.domain.Logininfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpRequest;
import org.springframework.util.StringUtils;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.http.HttpServletRequest;

/**
 *  获取登录用户信息
 */
public class LoginContextUtil {

    /**
     * 在线程中，每次请求都会拿到一个请求对象
     * 这个方法是拿到请求对象 并绑定到这个线程中
     * 只要拿到请求对象 一定就是这一次请求的对象
     * 同时发送请求 也只会拿到一个请求 不会拿第二个
     * 此处使用在只有一件货但是两个人同时购买
     * 可以防止超卖现象
     * @return
     */
    public static Logininfo getLoginContext(){
        // 拿到请求 RequestContextHolder 请求上下文工具
        // ServletRequestAttributes中有请求对象 是子类 所以强转到子类
        ServletRequestAttributes requestAttributes =
                (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();

        HttpServletRequest request = requestAttributes.getRequest();
        return getLoginContext(request);
    }

    public static Logininfo getLoginContext(HttpServletRequest request){

        // 获取token
        String token = request.getHeader("token");

        if(!StringUtils.isEmpty(token)){
            // 不能通过注解获取redisTemplate
            //  获取spring容器
            WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());

            //  再从容器中获取bean
            RedisTemplate redisTemplate = (RedisTemplate)applicationContext.getBean("redisTemplate");

            Object obj = redisTemplate.opsForValue().get(token);
            if(obj!=null){
                return (Logininfo)obj;
            }
        }
        return null;
    }
}
